package com.itlaobing.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 1、java.sql.PreparedStatement接口 继承了 java.sql.Statement接口
 * 2、对于 结构相同的SQL 来说，建议通过 PreparedStatement 来执行，因为可以通过服务器端的预先编译来提高效率
 */
public class PreparedStatementTest2 {
    public static void main(String[] args) throws Exception {

        String driverClassName = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/itlaobing?serverTimezone=Asia/Shanghai&useServerPrepStmts=true&cachePrepStmts=true";
        String user = "root";
        String password = "";

        // 加载驱动
        Class.forName(driverClassName); // ClassNotFoundException

        // 获得连接
        Connection conn = DriverManager.getConnection(url, user, password); // SQLException

        // 书写一个带有 "SQL参数占位符" 的 SQL语句
        String sql = "SELECT id , name , gender FROM t_students WHERE id = ? ";

        // 将带有 参数占位符 的 SQL语句发送给数据库服务器 、 接受数据库服务器返回的已经编译好的SQL指令标识符
        PreparedStatement ps = conn.prepareStatement(sql);

        ps.setInt(1,1);// 第一个参数表示 参数占位符的索引，第二个参数才是 参数占位符 的值
        ResultSet firstResult = ps.executeQuery();// 通常 执行 DQL 语句时 使用 executeQuery()
        while (firstResult.next()){
            int id = firstResult.getInt("id");
            String name = firstResult.getString("name");
            String gender = firstResult.getString("gender");
            System.out.println( id + " , " + name + " , " + gender );
        }
        firstResult.close();

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

        ps.setInt(1,2);// 第一个参数表示 参数占位符的索引，第二个参数才是 参数占位符 的值
        ResultSet secondResult = ps.executeQuery();// 通常 执行 DQL 语句时 使用 executeQuery()
        while (secondResult.next()){
            int id = secondResult.getInt("id");
            String name = secondResult.getString("name");
            String gender = secondResult.getString("gender");
            System.out.println( id + " , " + name + " , " + gender );
        }
        secondResult.close();

        // 释放资源
        ps.close();
        conn.close();
    }
}
